﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

#region

using Microsoft.Extensions.Caching.Memory;

#endregion

namespace Neto.Db.SqlSugar;

/// <summary>
///     sqlSugar 内存缓存
/// </summary>
[SuppressSniffer]
public class SqlSugarMemoryCache : ICacheService
{
    /// <summary>
    ///     添加缓存
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="key"></param>
    /// <param name="value"></param>
    public void Add<V>(string key, V value)
    {
        MemoryCacheHelper.Set(key, value);
    }

    /// <summary>
    ///     添加缓存
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <param name="cacheDurationInSeconds">缓存过期秒数</param>
    public void Add<V>(string key, V value, int cacheDurationInSeconds)
    {
        //限制最大值防止无止境的存储
        //限制为最长2个小时
        if (cacheDurationInSeconds > 7200) cacheDurationInSeconds = 3600 + RandomHelper.GetInt(100, 999);

        MemoryCacheHelper.Set(key, value,
            new MemoryCacheEntryOptions { SlidingExpiration = new TimeSpan(0, 0, cacheDurationInSeconds) });
    }

    /// <summary>
    ///     是否包含某个缓存Key
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="key"></param>
    /// <returns></returns>
    public bool ContainsKey<V>(string key)
    {
        return MemoryCacheHelper.Exist(key);
    }

    /// <summary>
    ///     获取缓存
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="key"></param>
    /// <returns></returns>
    public V Get<V>(string key)
    {
        return MemoryCacheHelper.Get<V>(key);
    }

    /// <summary>
    ///     获取所有缓存Key
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <returns></returns>
    public IEnumerable<string> GetAllKey<V>()
    {
        return MemoryCacheHelper.GetAllKeys();
    }

    /// <summary>
    ///     获取或者创建
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="cacheKey"></param>
    /// <param name="create"></param>
    /// <param name="cacheDurationInSeconds"></param>
    /// <returns></returns>
    public V GetOrCreate<V>(string cacheKey, Func<V> create, int cacheDurationInSeconds = int.MaxValue)
    {
        if (ContainsKey<V>(cacheKey))
        {
            var result = Get<V>(cacheKey);
            if (result == null)
                return create();
            return result;
        }
        else
        {
            var result = create();
            Add(cacheKey, result, cacheDurationInSeconds);
            return result;
        }
    }

    /// <summary>
    ///     移除缓存
    /// </summary>
    /// <typeparam name="V"></typeparam>
    /// <param name="key"></param>
    public void Remove<V>(string key)
    {
        MemoryCacheHelper.Remove(key);
    }
}